/**
 * @file common_interface.h
 * 
 * @brief 各大平台、环境常用接口
 */

#ifndef COMMON_INTERFACE_H
#define COMMON_INTERFACE_H

#include <stdlib.h>
#include <stdint.h>

/**
 * @brief 大小端类型
 */
typedef enum {
    COMMON_BIG_ENDIAN,      /**< 大端 */
    COMMON_SMALL_ENDIAN     /**< 小端 */
} common_endian;

/**
 * @brief 位值
 */
typedef enum {
    COMMON_BYTE_ZERO = 0,   /**< 位0 */
    COMMON_BYTE_ONE = 1     /**< 位1 */
} common_byte_type;

/**
 * @brief 将printf恢复为默认模式
 */
void printf_default(const char *format, ...);

/**
 * @brief 打印红色字体
 */
void printf_red(const char *format, ...);

/**
 * @brief 打印绿色字体
 */
void printf_green(const char *format, ...);

/**
 * @brief 打印白色字体
 */
void printf_white(const char *format, ...);

/**
 * @brief 打印蓝色字体
 */
void printf_blue(const char *format, ...);

/**
 * @brief 判断路径是否存在
 * 
 * @note 已经兼容Windows平台和Linux平台
 * 
 * @param path[in] 输入的路径，最大长度为256
 * @param path_len[in] 路径长度，该参数可为0，为0的情况下，path必须以'\0'结尾
 * 
 * @return COM_OK 路径存在
 */
int common_judge_path(const char *path, int path_len);

/**
 * @brief 判断当前系统为大端系统还是小端系统
 * 
 * @param result[out] 系统状态，0为大端，1为小端
 * 
 * @return COM_OK 执行成功
 */
int common_get_system_endian(common_endian *result);

/**
 * @brief 快速排序接口，以int为例，后续扩展
 * 
 * @param arr 待排序数组
 * @param left 左边界
 * @param right 右边界
 * 
 * @return COM_OK 排序成功
 */
int quick_sort(int arr[], int left, int right);

/**
 * @brief base64编码接口
 * 
 * @param out[out] 编码后的结果
 * @param olen[out] 编码后的长度
 * @param osize[in] out缓冲区的大小
 * @param in[in] 输入字符串
 * @param inlen[in] 输入字符串长度
 * 
 * @return COM_OK 编码成功
 */
int base64_encode(char out[], int *olen, int osize, char in[], int inlen);

/**
 * @brief base64解码接口
 * 
 * @param out[out] 解码后的结果
 * @param olen[out] 解码后的长度
 * @param osize[in] out缓冲区的大小
 * @param in[in] 输入字符串
 * @param inlen[in] 输入字符串长度
 * 
 * @return COM_OK 解码成功
 */
int base64_decode(char out[], int *olen, int osize, char in[], int inlen);

/**
 * @brief 1字节位操作set接口
 * 
 * @param in[in] 要操作的指针
 * @param byte_type[in] 要将该位设置为1或0
 * @param position[in] 操作的位，从低位开始算，例如： 1 0 1 1 0 0 0 1，修改第三位为1后：1 0 1 1 0 1 0 1
 * 
 * @return COM_OK 操作成功
 */
int common_byte_1_set(uint8_t *in, common_byte_type byte_type, int position);

/**
 * @brief 1字节位操作get接口
 * 
 * @param in[in] 要操作的指针
 * @param byte_type[out] 返回这一位是0还是1
 * @param position[in] 操作的位，从低位开始算，例如： 1 0 1 1 0 0 0 1，修改第三位为1后：1 0 1 1 0 1 0 1
 * 
 * @return COM_OK 操作成功
 */
int common_byte_1_get(uint8_t *in, common_byte_type *byte_type, int position);

/**
 * @brief 2字节位操作set接口
 * 
 * @param in[in] 要操作的指针
 * @param byte_type[in] 要将该位设置为1或0
 * @param position[in] 操作的位，从低位开始算，例如： 1 0 1 1 0 0 0 1，修改第三位为1后：1 0 1 1 0 1 0 1
 * 
 * @return COM_OK 操作成功
 */
int common_byte_2_set(uint16_t *in, common_byte_type byte_type, int position);

/**
 * @brief 2字节位操作get接口
 * 
 * @param in[in] 要操作的指针
 * @param byte_type[out] 返回这一位是0还是1
 * @param position[in] 操作的位，从低位开始算，例如： 1 0 1 1 0 0 0 1，修改第三位为1后：1 0 1 1 0 1 0 1
 * 
 * @return COM_OK 操作成功
 */
int common_byte_2_get(uint16_t *in, common_byte_type *byte_type, int position);

/**
 * @brief 4字节位操作set接口
 * 
 * @param in[in] 要操作的指针
 * @param byte_type[in] 要将该位设置为1或0
 * @param position[in] 操作的位，从低位开始算，例如： 1 0 1 1 0 0 0 1，修改第三位为1后：1 0 1 1 0 1 0 1
 * 
 * @return COM_OK 操作成功
 */
int common_byte_4_set(uint32_t *in, common_byte_type byte_type, int position);

/**
 * @brief 4字节位操作get接口
 * 
 * @param in[in] 要操作的指针
 * @param byte_type[out] 返回这一位是0还是1
 * @param position[in] 操作的位，从低位开始算，例如： 1 0 1 1 0 0 0 1，修改第三位为1后：1 0 1 1 0 1 0 1
 * 
 * @return COM_OK 操作成功
 */
int common_byte_4_get(uint32_t *in, common_byte_type *byte_type, int position);

/**
 * @brief 8字节位操作set接口
 * 
 * @param in[in] 要操作的指针
 * @param byte_type[in] 要将该位设置为1或0
 * @param position[in] 操作的位，从低位开始算，例如： 1 0 1 1 0 0 0 1，修改第三位为1后：1 0 1 1 0 1 0 1
 * 
 * @return COM_OK 操作成功
 */
int common_byte_8_set(uint64_t *in, common_byte_type byte_type, int position);

/**
 * @brief 8字节位操作get接口
 * 
 * @param in[in] 要操作的指针
 * @param byte_type[out] 返回这一位是0还是1
 * @param position[in] 操作的位，从低位开始算，例如： 1 0 1 1 0 0 0 1，修改第三位为1后：1 0 1 1 0 1 0 1
 * 
 * @return COM_OK 操作成功
 */
int common_byte_8_get(uint64_t *in, common_byte_type *byte_type, int position);

/**
 * @brief 大数加法
 * 
 * @param out[out] 运算结果
 * @param olen[out] 结果长度
 * @param out_size[in] buffer大小
 * @param left[in] 左操作数
 * @param right[in] 右操作数
 * 
 * @return COM_OK 操作成功
 */
int common_big_number_plus(char *out, int *olen, int out_size, const char left[], const char right[]);

/**
 * @brief 大数减法
 * 
 * @param out[out] 运算结果
 * @param olen[out] 结果长度
 * @param out_size[in] buffer大小
 * @param left[in] 左操作数
 * @param right[in] 右操作数
 * 
 * @return COM_OK 操作成功
 */
int common_big_number_subtraction(char *out, int *olen, int out_size, const char left[], const char right[]);

/**
 * @brief 大数乘法
 * 
 * @param out[out] 运算结果
 * @param olen[out] 结果长度
 * @param out_size[in] buffer大小
 * @param left[in] 左操作数
 * @param right[in] 右操作数
 * 
 * @return COM_OK 操作成功
 */
int common_big_number_multiplication(char *out, int *olen, int out_size, const char left[], const char right[]);

#endif // COMMON_INTERFACE_H
